import Big from 'big.js'

export const MathMixin = {
    /**
     * 数值相加
     * 支持浮点型
     *
     * @param {number} number1 数值1
     * @param {number} number2 数值2
     * @returns {number} 计算后的值
     */
    plus(number1, number2) {
        return new Big(number1).plus(number2).toNumber()
    },
    /**
     * 数值相减
     *
     * @param {number} number1 数值1
     * @param {number} number2 数值2
     * @returns {number} 计算后的值
     */
    minus(number1, number2) {
        return new Big(number1).minus(number2).toNumber()
    },
    /**
     * 数值相除
     *
     * @param {number} number1 分子
     * @param {number} number2 分母
     * @returns {number} 计算后的值
     */
    divide(number1, number2) {
        return new Big(number1).div(number2).toNumber()
    },
    /**
     * 数值相乘
     *
     * @param {number} number1 数值1
     * @param {number} number2 数值2
     * @returns {number} 计算后的值
     */
    multiply(number1, number2) {
        return new Big(number1).times(number2).toNumber()
    },
    /**
     * 数值求和
     *
     * @param {Array<number>} numbers 数值数组
     * @returns {number} 和
     */
    sum(numbers) {
        const reducer = (previousValue, currentValue) => this.plus(previousValue, currentValue)

        return numbers.reduce(reducer, 0)
    },
    // 两个数字比较大小
    getDecimalScale: function (number) {
        try {
            return number.toString().split('.')[1].length
        } catch (e) {
            return 0
        }
    },
    compare: function (v1, v2) {
        if (v1 > v2) {
            return -1
        } else if (v1 < v2) {
            return 1
        } else {
            return 0
        }
    },
    /**
     * 数值相加
     *
     * @param {number} v1 数值1
     * @param {number} v2 数值2
     * @returns {number} 计算后的值
     *
     * @deprecated
     */
    add(v1, v2) {
        return this.plus(v1, v2)
    },

    /**
     * 数值相减
     *
     * @param {number} v1 数值1
     * @param {number} v2 数值2
     * @returns {number} 计算后的值
     *
     * @deprecated
     */
    sub(v1, v2) {
        return this.minus(v1, v2)
    },

    round: function (decimal, scale) {
        const pow10 = Math.pow(10, scale)
        return Math.round(decimal * pow10) / pow10
    },

    floor: function (decimal, scale) {
        const pow10 = Math.pow(10, scale)
        return Math.floor(decimal * pow10) / pow10
    }
}
